package com.dream.plugin.simpledao.mapper;

import com.alibaba.fastjson.JSONObject;
import org.apache.ibatis.annotations.*;
import java.util.List;


/**
 * 对接Mybatis
 */
@Mapper
public interface SMapper {

    /**
     * 根据id查询
     * @param tableName 数据库表名
     * @param idName id名称
     * @param idVal id值
     * @return 记录
     */
    @Select("select * from ${tableName} where ${idName} = #{idVal} limit 0,1 ")
    JSONObject selectById(@Param("tableName") String tableName, @Param("idName") String idName, @Param("idVal") Object idVal);

    /**
     * 根据条件分页查询
     * @param tableName 数据库表名
     * @param condition 约束条件
     * @param start 分页开始位置，从0开始
     * @param size 记录数目
     * @return 记录内容
     */
    @Select("select * from ${tableName} ${condition} limit #{start},#{size}")
    List<JSONObject> selects(@Param("tableName") String tableName, @Param("condition") String condition, @Param("start") Integer start, @Param("size") Integer size);

    /**
     * 根据id更新数据库
     * @param tableName 数据库表名
     * @param settings 更新语句
     * @param idName id名称
     * @param idVal id值
     * @return 被更新的记录数
     */
    @Update("update ${tableName} set ${settings} where ${idName} = #{idVal}")
    Integer update(@Param("tableName") String tableName, @Param("settings") String settings, @Param("idName") String idName, @Param("idVal") Object idVal);

    /**
     * 插入数据
     * @param tableName 数据库表名
     * @param columns 数据库表字段列表
     * @param columnValues 数据库表字段的值
     * @return 插入的数量
     */
    @Insert("insert into ${tableName}(${columns}) values(${columnValues})")
    Integer insert(@Param("tableName") String tableName, @Param("columns") String columns, @Param("columnValues") String columnValues);


    /**
     * 根据id删除记录
     * @param tableName 数据库表名
     * @param idName id名称
     * @param idVal id值
     * @return 删除的记录数
     */
    @Delete("delete from ${tableName} where ${idName}=#{idVal}")
    Integer delete(@Param("tableName") String tableName, @Param("idName") String idName, @Param("idVal") Object idVal);

    /**
     * 查询指定条件的记录数量
     * @param tableName 数据库表名
     * @param condition 约束条件
     * @return 记录数
     */
    @Select("select count(*) from ${tableName} ${condition}")
    Integer count(@Param("tableName") String tableName, @Param("condition") String condition);

}
